import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;

public class ServiceImpl extends UnicastRemoteObject implements Service
{

    private HashMap<String,ArquivoLocal> listaArquivosLocal;
    
    public ServiceImpl() throws RemoteException
    {
        super();
        this.listaArquivosLocal = new HashMap<String, ArquivoLocal>();
        //ArquivoLocal arquivolocal = new ArquivoLocal("fileTeste.txt",222222222,"127.0.0.1",null,true);
        //this.listaArquivosLocal.put("fileTeste.txt", arquivolocal);
    }

    @Override
    public HashMap<String,ArquivoLocal> obterListaArquivos() throws RemoteException 
    {
        synchronized(this)
        {
            return this.listaArquivosLocal;
        }
    }

    @Override
    public boolean compartilharArquivo(ArquivoLocal arquivo) throws RemoteException 
    {
        synchronized(this)
        {
            if (!this.listaArquivosLocal.containsKey(arquivo.getNome())) 
            {
                ArquivoLocal arquivoLocal = new ArquivoLocal(arquivo.getNome(), arquivo.getVersao(), arquivo.getCliente_owner_ip(),
                    null, true);
                this.listaArquivosLocal.put(arquivoLocal.getNome() , arquivoLocal);
                //this.listaArquivosLocal.put(arquivo.getNome(), arquivo);
                return true;
            } 
            else 
            {
                return false;
            }
        }
    }

    @Override
    public boolean descompartilharArquivo(ArquivoLocal arquivo) throws RemoteException 
    {
        synchronized(this)
        {
            if (this.listaArquivosLocal.containsKey(arquivo.getNome())) //se o arquivo ta registrado no servidor
            {
                ArquivoLocal ar = this.listaArquivosLocal.get(arquivo.getNome());
                if(ar.getCliente_owner_ip().equals(arquivo.getCliente_owner_ip())) //se cliente eh dono do arquivo
                {
                    this.listaArquivosLocal.remove(arquivo.getNome());
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else 
            {
                return false;
            }
        }
    }

    @Override
    public boolean atualizarArquivo(ArquivoLocal arquivo) throws RemoteException 
    {
        if (this.listaArquivosLocal.containsKey(arquivo.getNome())) 
        {
            ArquivoLocal al = (ArquivoLocal) this.listaArquivosLocal.get(arquivo.getNome());
            if(al.getCliente_owner_ip().equals(arquivo.getCliente_owner_ip())) //se eh o dono do arquivo
            {
                al.setVersao(arquivo.getVersao());
                return true;
            }

            return false;
        }
        else
        {
            return false;
        }
    }

    @Override
    public long verificarVersaoArquivo(String nome) throws RemoteException {
        if (this.listaArquivosLocal.containsKey(nome)) {
            ArquivoLocal al = (ArquivoLocal) this.listaArquivosLocal.get(nome);
            long versao = (long) al.getVersao();
            return versao;
        } else {
            return 0;
        }        
    }
}
